﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveriLib.BL;
using GestionePolveri2.DAL;
using FrameworkLib.Filters;
using LinqKit;
using System.Linq.Expressions;

namespace GestionePolveriLib.Facades.Extensions
{
    public static class ComposizioneColorePageFacadeExtExtension
    {
        public static List<ComposizioneColore2> GetComposizioneColore2All(this ComposizioneColorePageFacadeExt facade)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = from x in context.ComposizioneColori
                           orderby x.AnagColori.CodiceColore ascending
                           select new ComposizioneColore2
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Note = y.Note,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               PolvereBase = (from pb in context.AnagPolveri
                                              where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                              select new PolvereExt
                                              {
                                                  CodicePolvere = pb.CodicePolvere,
                                                  Descrizione = pb.Descrizione,
                                                  Note = pb.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pb.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault(),
                               PolvereVenatura = (from pv in context.AnagPolveri
                                                  where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                  select new PolvereExt
                                                  {
                                                      CodicePolvere = pv.CodicePolvere,
                                                      Descrizione = pv.Descrizione,
                                                      Note = pv.Note,
                                                      Fornitore = (from f in context.AnagFornitori
                                                                   where f.IDFornitore == pv.IDFornitore
                                                                   select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                  }).FirstOrDefault()
                           };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public static List<ComposizioneColore2> GetComposizioneColore2All(this ComposizioneColorePageFacadeExt facade, FilterBase<ComposizioneColori> filter)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = from x in context.ComposizioneColori.AsExpandable().Where(filter.SetUpFilter())
                          orderby x.AnagColori.CodiceColore ascending
                          select new ComposizioneColore2
                          {
                              ID = x.IDComposizione,
                              Colore = (from y in context.AnagColori
                                        where y.IDColore == x.IDColore
                                        select new Colore
                                        {
                                            ID = y.IDColore,
                                            CodiceColore = y.CodiceColore,
                                            Descrizione = y.Descrizione,
                                            Note = y.Note,
                                            Famiglia = (from f in context.AnagFamiglie
                                                        where f.IDFamiglia == y.IDFamiglia
                                                        select new FamigliaColore
                                                        {
                                                            ID = f.IDFamiglia,
                                                            Descrizione = f.Descrizione
                                                        }).FirstOrDefault()
                                        }).FirstOrDefault(),
                              PolvereBase = (from pb in context.AnagPolveri
                                             where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                             select new PolvereExt
                                             {
                                                 CodicePolvere = pb.CodicePolvere,
                                                 Descrizione = pb.Descrizione,
                                                 Note = pb.Note,
                                                 Fornitore = (from f in context.AnagFornitori
                                                              where f.IDFornitore == pb.IDFornitore
                                                              select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                             }).FirstOrDefault(),
                              PolvereVenatura = (from pv in context.AnagPolveri
                                                 where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                 select new PolvereExt
                                                 {
                                                     CodicePolvere = pv.CodicePolvere,
                                                     Descrizione = pv.Descrizione,
                                                     Note = pv.Note,
                                                     Fornitore = (from f in context.AnagFornitori
                                                                  where f.IDFornitore == pv.IDFornitore
                                                                  select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                 }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
                                            
        public static List<ComposizioneColore2> GetComposizioneColore2(this ComposizioneColorePageFacadeExt facade)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = (from x in context.ComposizioneColori
                           orderby x.AnagColori.CodiceColore ascending
                           select new ComposizioneColore2
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Note = y.Note,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               PolvereBase = (from pb in context.AnagPolveri
                                              where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                              select new PolvereExt
                                              {
                                                  CodicePolvere = pb.CodicePolvere,
                                                  Descrizione = pb.Descrizione,
                                                  Note = pb.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pb.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault(),
                               PolvereVenatura = (from pv in context.AnagPolveri
                                                  where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                              select new PolvereExt
                                              {
                                                  CodicePolvere = pv.CodicePolvere,
                                                  Descrizione = pv.Descrizione,
                                                  Note = pv.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pv.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault()
                           }).Skip(facade.Skip).Take(facade.PageSize);

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public static List<ComposizioneColore2> GetComposizioneColore2(this ComposizioneColorePageFacadeExt facade, FilterBase<ComposizioneColori> filter)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = (from x in context.ComposizioneColori.AsExpandable().Where(filter.SetUpFilter())
                           orderby x.AnagColori.CodiceColore ascending
                           select new ComposizioneColore2
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Note = y.Note,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               PolvereBase = (from pb in context.AnagPolveri
                                              where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                              select new PolvereExt
                                              {
                                                  Descrizione = pb.Descrizione,
                                                  Note = pb.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pb.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault(),
                               PolvereVenatura = (from pb in context.AnagPolveri
                                                  where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                  select new PolvereExt
                                                  {
                                                      Descrizione = pb.Descrizione,
                                                      Note = pb.Note,
                                                      Fornitore = (from f in context.AnagFornitori
                                                                   where f.IDFornitore == pb.IDFornitore
                                                                   select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                  }).FirstOrDefault()
                           }).Skip(facade.Skip).Take(facade.PageSize);

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }

    public static class ComposizioneColoreFacadeExtension
    {
        public static List<ComposizioneColore2> GetComposizioneColore2All(this ComposizioneColoreFacadeExt facade)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = from x in context.ComposizioneColori
                          orderby x.AnagColori.CodiceColore ascending
                          select new ComposizioneColore2
                          {
                              ID = x.IDComposizione,
                              Colore = (from y in context.AnagColori
                                        where y.IDColore == x.IDColore
                                        select new Colore
                                        {
                                            ID = y.IDColore,
                                            CodiceColore = y.CodiceColore,
                                            Descrizione = y.Descrizione,
                                            Note = y.Note,
                                            Famiglia = (from f in context.AnagFamiglie
                                                        where f.IDFamiglia == y.IDFamiglia
                                                        select new FamigliaColore
                                                        {
                                                            ID = f.IDFamiglia,
                                                            Descrizione = f.Descrizione
                                                        }).FirstOrDefault()
                                        }).FirstOrDefault(),
                              PolvereBase = (from pb in context.AnagPolveri
                                             where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                             select new PolvereExt
                                             {
                                                 CodicePolvere = pb.CodicePolvere,
                                                 Descrizione = pb.Descrizione,
                                                 Note = pb.Note,
                                                 Fornitore = (from f in context.AnagFornitori
                                                              where f.IDFornitore == pb.IDFornitore
                                                              select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                             }).FirstOrDefault(),
                              PolvereVenatura = (from pv in context.AnagPolveri
                                                 where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                 select new PolvereExt
                                                 {
                                                     CodicePolvere = pv.CodicePolvere,
                                                     Descrizione = pv.Descrizione,
                                                     Note = pv.Note,
                                                     Fornitore = (from f in context.AnagFornitori
                                                                  where f.IDFornitore == pv.IDFornitore
                                                                  select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                 }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public static List<ComposizioneColore2> GetComposizioneColore2All(this ComposizioneColoreFacadeExt facade, FilterBase<ComposizioneColori> filter)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = from x in context.ComposizioneColori.AsExpandable().Where(filter.SetUpFilter())
                          orderby x.AnagColori.CodiceColore ascending
                          select new ComposizioneColore2
                          {
                              ID = x.IDComposizione,
                              Colore = (from y in context.AnagColori
                                        where y.IDColore == x.IDColore
                                        select new Colore
                                        {
                                            ID = y.IDColore,
                                            CodiceColore = y.CodiceColore,
                                            Descrizione = y.Descrizione,
                                            Note = y.Note,
                                            Famiglia = (from f in context.AnagFamiglie
                                                        where f.IDFamiglia == y.IDFamiglia
                                                        select new FamigliaColore
                                                        {
                                                            ID = f.IDFamiglia,
                                                            Descrizione = f.Descrizione
                                                        }).FirstOrDefault()
                                        }).FirstOrDefault(),
                              PolvereBase = (from pb in context.AnagPolveri
                                             where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                             select new PolvereExt
                                             {
                                                 CodicePolvere = pb.CodicePolvere,
                                                 Descrizione = pb.Descrizione,
                                                 Note = pb.Note,
                                                 Fornitore = (from f in context.AnagFornitori
                                                              where f.IDFornitore == pb.IDFornitore
                                                              select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                             }).FirstOrDefault(),
                              PolvereVenatura = (from pv in context.AnagPolveri
                                                 where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                 select new PolvereExt
                                                 {
                                                     CodicePolvere = pv.CodicePolvere,
                                                     Descrizione = pv.Descrizione,
                                                     Note = pv.Note,
                                                     Fornitore = (from f in context.AnagFornitori
                                                                  where f.IDFornitore == pv.IDFornitore
                                                                  select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                 }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public static List<ComposizioneColore2> GetComposizioneColore2(this ComposizioneColoreFacadeExt facade)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = (from x in context.ComposizioneColori
                           orderby x.AnagColori.CodiceColore ascending
                           select new ComposizioneColore2
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Note = y.Note,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               PolvereBase = (from pb in context.AnagPolveri
                                              where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                              select new PolvereExt
                                              {
                                                  CodicePolvere = pb.CodicePolvere,
                                                  Descrizione = pb.Descrizione,
                                                  Note = pb.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pb.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault(),
                               PolvereVenatura = (from pv in context.AnagPolveri
                                                  where pv.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                  select new PolvereExt
                                                  {
                                                      CodicePolvere = pv.CodicePolvere,
                                                      Descrizione = pv.Descrizione,
                                                      Note = pv.Note,
                                                      Fornitore = (from f in context.AnagFornitori
                                                                   where f.IDFornitore == pv.IDFornitore
                                                                   select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                  }).FirstOrDefault()
                           });

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public static List<ComposizioneColore2> GetComposizioneColore2(this ComposizioneColoreFacadeExt facade, FilterBase<ComposizioneColori> filter)
        {
            List<ComposizioneColore2> retValue = null;

            try
            {
                GestionePolveriEntities context = facade.GetContext();

                var obj = (from x in context.ComposizioneColori.AsExpandable().Where(filter.SetUpFilter())
                           orderby x.AnagColori.CodiceColore ascending
                           select new ComposizioneColore2
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Note = y.Note,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               PolvereBase = (from pb in context.AnagPolveri
                                              where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("b")
                                              select new PolvereExt
                                              {
                                                  CodicePolvere = pb.CodicePolvere,
                                                  Descrizione = pb.Descrizione,
                                                  Note = pb.Note,
                                                  Fornitore = (from f in context.AnagFornitori
                                                               where f.IDFornitore == pb.IDFornitore
                                                               select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                              }).FirstOrDefault(),
                               PolvereVenatura = (from pb in context.AnagPolveri
                                                  where pb.IDPolvere == x.IDPolvere && x.Applicazione.Contains("v")
                                                  select new PolvereExt
                                                  {
                                                      CodicePolvere = pb.CodicePolvere,
                                                      Descrizione = pb.Descrizione,
                                                      Note = pb.Note,
                                                      Fornitore = (from f in context.AnagFornitori
                                                                   where f.IDFornitore == pb.IDFornitore
                                                                   select new Fornitore { Descrizione = f.Descrizione }).FirstOrDefault()
                                                  }).FirstOrDefault()
                           });

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

    }
}
